#ifndef ADVANCEDINPUTHANDLER_H
#define ADVANCEDINPUTHANDLER_H

#include <QObject>
#include <QKeyEvent>
#include <QTimer>
#include <QDateTime>
#include <QQueue>

/**
 * @brief 高级输入处理器
 * 
 * 基于Qt6_Client_Development_Guide.md实现的高级输入处理
 * 包含延迟补偿、输入预测、防抖动等功能
 */
class AdvancedInputHandler : public QObject
{
    Q_OBJECT

public:
    /**
     * @brief 方向枚举
     */
    enum Direction {
        NONE = -1,
        UP = 0,
        DOWN = 1,
        LEFT = 2,
        RIGHT = 3
    };

    /**
     * @brief 输入事件结构
     */
    struct InputEvent {
        Direction direction;
        qint64 timestamp;
        bool processed;
        
        InputEvent() : direction(NONE), timestamp(0), processed(false) {}
        InputEvent(Direction dir, qint64 time) : direction(dir), timestamp(time), processed(false) {}
    };

    explicit AdvancedInputHandler(QObject *parent = nullptr);

    // === 核心输入处理 ===
    
    /**
     * @brief 处理按键按下事件
     * @param event 键盘事件
     */
    void handleKeyPress(QKeyEvent* event);
    
    /**
     * @brief 处理按键释放事件
     * @param event 键盘事件
     */
    void handleKeyRelease(QKeyEvent* event);

    // === 配置方法 ===
    
    /**
     * @brief 设置网络延迟补偿
     * @param latencyMs 延迟（毫秒）
     */
    void setLatencyCompensation(int latencyMs);
    
    /**
     * @brief 启用/禁用输入缓冲
     * @param enabled 是否启用
     */
    void setInputBuffering(bool enabled);
    
    /**
     * @brief 设置防抖动间隔
     * @param intervalMs 间隔（毫秒）
     */
    void setDebounceInterval(int intervalMs);
    
    /**
     * @brief 设置输入预测
     * @param enabled 是否启用
     */
    void setInputPrediction(bool enabled);

    // === 状态查询 ===
    
    /**
     * @brief 获取最后发送的方向
     */
    Direction getLastSentDirection() const { return m_lastSentDirection; }
    
    /**
     * @brief 获取当前待处理的方向
     */
    Direction getPendingDirection() const { return m_pendingDirection; }
    
    /**
     * @brief 检查是否有待处理的输入
     */
    bool hasPendingInput() const { return !m_inputQueue.isEmpty(); }

    // === 服务器响应验证 ===
    
    /**
     * @brief 验证服务器响应
     * @param serverDirection 服务器确认的方向
     * @param serverTimestamp 服务器时间戳
     */
    void validateServerResponse(Direction serverDirection, qint64 serverTimestamp);
    
    /**
     * @brief 处理输入确认
     * @param direction 确认的方向
     * @param timestamp 时间戳
     */
    void confirmInput(Direction direction, qint64 timestamp);

public slots:
    /**
     * @brief 处理输入缓冲定时器
     */
    void processInputBuffer();
    
    /**
     * @brief 重置输入状态
     */
    void reset();

private slots:
    /**
     * @brief 处理防抖动定时器
     */
    void onDebounceTimer();

private:
    // === 输入处理方法 ===
    
    /**
     * @brief 将按键转换为方向
     * @param key 按键代码
     * @return 方向
     */
    Direction keyToDirection(int key);
    
    /**
     * @brief 检查是否为相反方向
     * @param dir1 方向1
     * @param dir2 方向2
     * @return 是否相反
     */
    bool isOppositeDirection(Direction dir1, Direction dir2);
    
    /**
     * @brief 发送方向改变
     * @param direction 新方向
     */
    void sendDirectionChange(Direction direction);
    
    /**
     * @brief 预测移动
     * @param direction 方向
     */
    void predictMovement(Direction direction);
    
    /**
     * @brief 处理输入队列
     */
    void processInputQueue();

    // === 成员变量 ===
    
    // 输入状态
    Direction m_lastSentDirection;      ///< 最后发送的方向
    Direction m_pendingDirection;       ///< 待处理的方向
    Direction m_predictedDirection;     ///< 预测的方向
    
    qint64 m_lastInputTime;             ///< 最后输入时间
    qint64 m_lastSendTime;              ///< 最后发送时间
    
    // 配置参数
    int m_networkLatency;               ///< 网络延迟（毫秒）
    int m_debounceInterval;             ///< 防抖动间隔（毫秒）
    bool m_inputBuffering;              ///< 是否启用输入缓冲
    bool m_inputPrediction;             ///< 是否启用输入预测
    
    // 输入队列和缓冲
    QQueue<InputEvent> m_inputQueue;    ///< 输入事件队列
    QTimer* m_bufferTimer;              ///< 输入缓冲定时器
    QTimer* m_debounceTimer;            ///< 防抖动定时器
    
    // 性能统计
    int m_inputCount;                   ///< 输入计数
    int m_confirmedInputs;              ///< 确认的输入数
    int m_rejectedInputs;               ///< 被拒绝的输入数
    qint64 m_averageLatency;            ///< 平均延迟

signals:
    /**
     * @brief 方向改变信号
     * @param direction 新方向
     */
    void directionChanged(Direction direction);
    
    /**
     * @brief 输入预测信号
     * @param direction 预测的方向
     * @param confidence 置信度 (0.0-1.0)
     */
    void inputPredicted(Direction direction, float confidence);
    
    /**
     * @brief 输入确认信号
     * @param direction 确认的方向
     * @param latency 延迟（毫秒）
     */
    void inputConfirmed(Direction direction, int latency);
    
    /**
     * @brief 输入被拒绝信号
     * @param direction 被拒绝的方向
     * @param reason 拒绝原因
     */
    void inputRejected(Direction direction, const QString& reason);
};

#endif // ADVANCEDINPUTHANDLER_H
